/* 
 * File:   ordena.c
 * Author: Vagner Clementino
 *
 * Created on 9 de Abril de 2012, 17:35
 */

void Particao(int Esq, int Dir, 
              int *i, int *j, int* A)
{ int x, w;
  *i = Esq;  *j = Dir;
  x = A[(*i + *j) / 2]; /* obtem o pivo x */
  do 
    { while (x > A[*i]) (*i)++;
      while (x < A[*j]) (*j)--;
      if (*i <= *j) 
      { w = A[*i]; A[*i] = A[*j]; A[*j] = w;
        (*i)++; (*j)--;
      }
    } while (*i <= *j);
}

void Ordena(int Esq, int Dir, int* A)
{ int i, j;
  Particao(Esq, Dir, &i, &j, A);
  if (Esq < j) Ordena(Esq, j, A);
  if (i < Dir) Ordena(i, Dir, A);
}

void QuickSort(int *A, int n)
{ Ordena(0, n-1, A); }